<?php


class LocationManager {

    private $nbparpage = 10;

    public function __construct(Mypdo $db){
        $this->db= $db;
    }

    public function add(Location $location){
        $req = $this->db->prepare('INSERT INTO location ( id_immeu, nom_loc, montant_loc, tva_loc, appel_loc,
 statut_loc, descp_loc, surface_loc, nb_piece_loc, nb_chambre_loc, meuble_loc, exposition_loc, encaissement_loc, type_loc ) VALUES
                  ( :id_immeu, :nom_loc, :montant_loc, :tva_loc, :appel_loc,
 :statut_loc, :descp_loc, :surface_loc, :nb_piece_loc, :nb_chambre_loc, :meuble_loc, :exposition_loc, :encaissement_loc, :type_loc)');
        $req->bindValue(':id_immeu', $location->getIdImmeu(), PDO::PARAM_INT);
        $req->bindValue(':nom_loc', $location->getNomLoc(), PDO::PARAM_STR);
        $req->bindValue(':montant_loc', $location->getMontantLoc(), PDO::PARAM_STR);
        $req->bindValue(':tva_loc', $location->getTvaLoc(), PDO::PARAM_STR);

        $req->bindValue(':appel_loc', $location->getAppelLoc(), PDO::PARAM_INT);
        $req->bindValue(':statut_loc', $location->getStatutLoc(), PDO::PARAM_INT);
        $req->bindValue(':descp_loc', $location->getDescpLoc(), PDO::PARAM_STR);
        $req->bindValue(':surface_loc', $location->getSurfaceLoc(), PDO::PARAM_INT);
        $req->bindValue(':nb_piece_loc', $location->getNbPieceLoc(), PDO::PARAM_INT);
        $req->bindValue(':nb_chambre_loc', $location->getNbChambreLoc(), PDO::PARAM_INT);
        $req->bindValue(':meuble_loc', $location->getMeubleLoc(), PDO::PARAM_BOOL);
        $req->bindValue(':exposition_loc', $location->getExpositionLoc(), PDO::PARAM_STR);
        $req->bindValue(':encaissement_loc', $location->getEncaissementLoc(), PDO::PARAM_STR);
        $req->bindValue(':type_loc', $location->getTypeLoc(), PDO::PARAM_STR);

        $req->execute();
        return $this->db->lastInsertId();
    }


    public function getList(){
        $listeLocations = array();
        $sql = 'SELECT * FROM location ORDER BY id_immeu';
        $req = $this->db->query($sql);
        while ($location = $req->fetch(PDO::FETCH_OBJ)){
            $listeLocations[] = new Location($location);
        }
        $req->closeCursor();
        return $listeLocations;

    }

    public function getId(Location $location)
    {
        $sql = 'SELECT id_loc FROM location WHERE id_immeu = :id_immeu AND nom_loc = :nom_loc AND montant_loc = :montant_loc AND type_loc = :type_loc';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_immeu', $location->getIdImmeu(), PDO::PARAM_INT);
        $req->bindValue(':nom_loc', $location->getNomLoc(), PDO::PARAM_STR);
        $req->bindValue(':montant_loc', $location->getMontantLoc(), PDO::PARAM_STR);
        $req->bindValue(':type_loc', $location->getTypeLoc(), PDO::PARAM_STR);

        $req->execute();
        return $req->fetch(PDO::FETCH_OBJ)->id_loc;
    }

    public function  delLocationByIdPropri($id_propri){
        $sql = 'DELETE FROM immoloc.location WHERE id_immeu IN
        (SELECT id_immeu FROM immeuble
        WHERE id_propri = :id_propri)';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_propri', $id_propri, PDO::PARAM_INT);

        $req->execute();

    }


    public function  delLocationByIdImmeu($id_immeu){
        $sql = 'DELETE FROM immoloc.location
        WHERE id_immeu = :id_immeu';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_immeu', $id_immeu, PDO::PARAM_INT);

        $req->execute();

    }

    public function  delLocation($id_loc){
        $sql = 'DELETE FROM immoloc.location
        WHERE id_loc = :id_loc';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loc', $id_loc, PDO::PARAM_INT);

        $req->execute();

    }


    public function getLoc($id_loc){
        $sql = 'SELECT * FROM immoloc.location WHERE id_loc = :id_loc';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loc', $id_loc, PDO::PARAM_INT);
        $req->execute();
        $liste = $req->fetch(PDO::FETCH_ASSOC);
        $loc = new Location($liste);

        return $loc;
    }

    public function update(Location $loc)
    {
        $req = $this->db->prepare('UPDATE location SET
                    id_immeu = :id_immeu, nom_loc = :nom_loc, montant_loc = :montant_loc, tva_loc = :tva_loc, appel_loc = :appel_loc,
                    statut_loc = :statut_loc, descp_loc = :descp_loc, surface_loc = :surface_loc, nb_piece_loc = :nb_piece_loc,
                    nb_chambre_loc = :nb_chambre_loc , meuble_loc = :meuble_loc, exposition_loc = :exposition_loc, encaissement_loc = :encaissement_loc ,
                    type_loc = :type_loc
                   WHERE id_loc = :id_loc');

        $req->bindValue(':id_loc', $loc->getIdLoc(), PDO::PARAM_INT);

        $req->bindValue(':id_immeu', $loc->getIdImmeu(), PDO::PARAM_INT);
        $req->bindValue(':nom_loc', $loc->getNomLoc(), PDO::PARAM_STR);
        $req->bindValue(':montant_loc', $loc->getMontantLoc(), PDO::PARAM_STR);
        $req->bindValue(':tva_loc', $loc->getTvaLoc(), PDO::PARAM_STR);
        $req->bindValue(':appel_loc', $loc->getAppelLoc(), PDO::PARAM_STR);
        $req->bindValue(':statut_loc', $loc->getStatutLoc(), PDO::PARAM_STR);
        $req->bindValue(':descp_loc', $loc->getDescpLoc(), PDO::PARAM_STR);
        $req->bindValue(':surface_loc', $loc->getSurfaceLoc(), PDO::PARAM_STR);
        $req->bindValue(':nb_piece_loc', $loc->getNbPieceLoc(), PDO::PARAM_STR);
        $req->bindValue(':nb_chambre_loc', $loc->getNbChambreLoc(), PDO::PARAM_STR);
        $req->bindValue(':meuble_loc', $loc->getMeubleLoc(), PDO::PARAM_STR);
        $req->bindValue(':exposition_loc', $loc->getExpositionLoc(), PDO::PARAM_STR);
        $req->bindValue(':encaissement_loc', $loc->getEncaissementLoc(), PDO::PARAM_STR);
        $req->bindValue(':type_loc', $loc->getTypeLoc(), PDO::PARAM_STR);


        $req->execute();
    }

    public function getListNouv($id_loca)
    {
        $sql = 'SELECT * FROM location WHERE id_loc NOT IN
        (SELECT id_loc FROM occupe WHERE id_loca = :id_loca )';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loca', $id_loca, PDO::PARAM_STR);

        $req->execute();

        $table = $req->fetchAll(PDO::FETCH_ASSOC);

        $liste = array();
        foreach ($table as $value) {
            $liste[] = new Location($value);
        }

        return $liste;
    }
    public function getLocationByIdPers($id_pers)
    {
        $sql = 'SELECT * FROM location l
        INNER JOIN occupe o ON o.id_loc = l.id_loc
        INNER JOIN locataire lo ON lo.id_loca = o.id_loca
        INNER JOIN partage p ON p.id_loca = lo.id_loca
        WHERE p.id_pers = :id_pers';

        $req = $this->db->prepare($sql);
        $req->bindValue(':id_pers', $id_pers, PDO::PARAM_INT);
        $req->execute();
        $liste = array();
        foreach ($req->fetchAll(PDO::FETCH_ASSOC) as $value) {
            $liste[] = new Location($value);
        }

        return $liste;

    }

    /*
     * true pour occuper
     * false pour libre
     */
    public function updateStatut($id_loc, $statut)
    {
        $sql = 'UPDATE location SET statut_loc = :statut_loc WHERE id_loc = :id_loc';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loc', $id_loc, PDO::PARAM_INT);
        $req->bindValue(':statut_loc', $statut, PDO::PARAM_INT);
        $req->execute();
    }

    public function getStatut($id_loc)
    {
        $sql = 'SELECT date_bail_deb_loca, date_bail_fin_loca FROM locataire l
        INNER JOIN occupe o ON o.id_loca = l.id_loca
        WHERE o.id_loc = :id_loc';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loc', $id_loc, PDO::PARAM_INT);
        $req->execute();

        $liste = $req->fetchAll(PDO::FETCH_ASSOC);
        $stat = true;
        
        $datej = new DateTime();
        foreach ($liste as $value) {
            $deb = new DateTime($value['date_bail_deb_loca']);
            $fin = new DateTime($value['date_bail_fin_loca']);
            if($deb<$datej&&$datej<$fin){
                $stat = false;
            }
        }



        return $stat;

    }

    public function getLocByIdLoca($id_loca)
    {
        $sql = 'SELECT * FROM location l
        INNER JOIN occupe o ON o.id_loc = l.id_loc
        WHERE o.id_loca = :id_loca';

        $req = $this->db->prepare($sql);
        $req->bindValue(':id_loca', $id_loca, PDO::PARAM_INT);
        $req->execute();
        $liste = array();
        foreach ($req->fetchAll(PDO::FETCH_ASSOC) as $value) {
            $liste[] = new Location($value);
        }

        return $liste;
    }

    public function getLocByMultiRecherche($liste = array()){

        $type_loc = false;
        $surface_loc_min = false;
        $surface_loc_max = false;
        $localisation = false;
        $budget_min = false;
        $budget_max = false;
        $nb_piece_loc = false;
        $sql_type_loc = '';
        $sql_surface_loc_min = '';
        $sql_surface_loc_max = '';
        $sql_localisation = '';
        $sql_budget_min = '';
        $sql_budget_max = '';
        $sql_nb_piece_loc = '';
        foreach ($liste as  $attribut => $valeur){
            switch($attribut){
                case 'type_loc': $type_loc = $valeur; if($valeur && $valeur != 'Selectionner...')$sql_type_loc = ' AND type_loc = :type_loc';
                    break;
                case 'mmin': $surface_loc_min = $valeur; if($valeur) $sql_surface_loc_min = ' AND surface_loc > :surface_loc_min';
                    break;
                case 'mmax': $surface_loc_max = $valeur; if($valeur)$sql_surface_loc_max = ' AND surface_loc < :surface_loc_max';
                    break;
                case 'lieu': $localisation = $valeur; if($valeur)$sql_localisation = ' AND (cp_ad_immeu LIKE :localisation OR ville_ad_immeu LIKE :localisation_2)';
                    break;
                case 'bmin': $budget_min = $valeur; if($valeur)$sql_budget_min = ' AND montant_loc > :budget_min';
                    break;
                case 'bmax': $budget_max = $valeur; if($valeur)$sql_budget_max = ' AND montant_loc < :budget_max';
                    break;
                case 'piece': $nb_piece_loc = $valeur; if($valeur)$sql_nb_piece_loc = ' AND nb_piece_loc = :nb_piece_loc';
                    break;
            }
        }

        $sql = 'SELECT * FROM location l
        INNER JOIN immeuble i ON i.id_immeu = l.id_immeu
         WHERE id_loc >= 0'.$sql_type_loc.$sql_surface_loc_min.$sql_surface_loc_max.$sql_localisation.$sql_budget_min.$sql_budget_max.$sql_nb_piece_loc;

        $req = $this->db->prepare($sql);

        if($type_loc && $type_loc != 'Selectionner...') $req->bindValue(':type_loc', $type_loc, PDO::PARAM_STR);
        if($surface_loc_min) $req->bindValue(':surface_loc_min', $surface_loc_min, PDO::PARAM_STR);
        if($surface_loc_max) $req->bindValue(':surface_loc_max', $surface_loc_max, PDO::PARAM_STR);
        if($localisation){  $req->bindValue(':localisation', $localisation.'%', PDO::PARAM_STR);
                            $req->bindValue(':localisation_2', $localisation.'%', PDO::PARAM_STR);}
        if($budget_min) $req->bindValue(':budget_min', $budget_min, PDO::PARAM_STR);
        if($budget_max) $req->bindValue(':budget_max', $budget_max, PDO::PARAM_STR);
        if($nb_piece_loc) $req->bindValue(':nb_piece_loc', $nb_piece_loc, PDO::PARAM_STR);

        $req->execute();
        $listeLoc = array();
        foreach ($req->fetchAll(PDO::FETCH_ASSOC) as $value) {
            $listeLoc[] = new Location($value);
        }

        return $listeLoc;

    }

    public function getListByIdImmeu($id_immeu)
    {
        $listeLocations = array();
        $sql = 'SELECT * FROM location WHERE id_immeu = :id_immeu ORDER BY id_immeu';
        $req = $this->db->prepare($sql);
        $req->bindValue(':id_immeu', $id_immeu, PDO::PARAM_INT);

        $req->execute();
        while ($location = $req->fetch(PDO::FETCH_OBJ)){
            $listeLocations[] = new Location($location);
        }
        $req->closeCursor();
        return $listeLocations;
    }

    public function getListByPage($p)
    {
        if(!is_int($p))
        {
            $p = 1;
        }
        $nombre = $this->nbparpage;
        $limite = ($p-1)*$nombre;
        $listeLocations = array();
        $sql = 'SELECT * FROM location ORDER BY id_immeu LIMIT :limite, :nombre';
        $req = $this->db->prepare($sql);
        $req->bindValue(':limite', $limite, PDO::PARAM_INT);
        $req->bindValue(':nombre', $nombre, PDO::PARAM_INT);

        $req->execute();
        while ($location = $req->fetch(PDO::FETCH_OBJ)){
            $listeLocations[] = new Location($location);
        }
        $req->closeCursor();
        return $listeLocations;
    }

    public function getNb()
    {
        $sql = 'SELECT COUNT(*) AS nb FROM location';
        $req = $this->db->query($sql);
        return $req->fetch(PDO::FETCH_ASSOC)[0]['nb'];
    }

    public function getLocByMultiRecherchePage($liste = array())
    {

        $nombre = $this->nbparpage;
        $limite = ($_GET['p']-1)*$nombre;

        $type_loc = false;
        $surface_loc_min = false;
        $surface_loc_max = false;
        $localisation = false;
        $budget_min = false;
        $budget_max = false;
        $nb_piece_loc = false;
        $sql_type_loc = '';
        $sql_surface_loc_min = '';
        $sql_surface_loc_max = '';
        $sql_localisation = '';
        $sql_budget_min = '';
        $sql_budget_max = '';
        $sql_nb_piece_loc = '';
        foreach ($liste as  $attribut => $valeur){
            switch($attribut){
                case 'type_loc': $type_loc = $valeur; if($valeur && $valeur != 'Selectionner...')$sql_type_loc = ' AND type_loc = :type_loc';
                    break;
                case 'mmin': $surface_loc_min = $valeur; if($valeur) $sql_surface_loc_min = ' AND surface_loc > :surface_loc_min';
                    break;
                case 'mmax': $surface_loc_max = $valeur; if($valeur)$sql_surface_loc_max = ' AND surface_loc < :surface_loc_max';
                    break;
                case 'lieu': $localisation = $valeur; if($valeur)$sql_localisation = ' AND (cp_ad_immeu LIKE :localisation OR ville_ad_immeu LIKE :localisation_2)';
                    break;
                case 'bmin': $budget_min = $valeur; if($valeur)$sql_budget_min = ' AND montant_loc > :budget_min';
                    break;
                case 'bmax': $budget_max = $valeur; if($valeur)$sql_budget_max = ' AND montant_loc < :budget_max';
                    break;
                case 'piece': $nb_piece_loc = $valeur; if($valeur)$sql_nb_piece_loc = ' AND nb_piece_loc = :nb_piece_loc';
                    break;
            }
        }

        $sql = 'SELECT * FROM location l
        INNER JOIN immeuble i ON i.id_immeu = l.id_immeu
         WHERE id_loc >= 0'.$sql_type_loc.$sql_surface_loc_min.$sql_surface_loc_max.$sql_localisation.$sql_budget_min.$sql_budget_max.$sql_nb_piece_loc.
        ' LIMIT :limite, :nombre';

        $req = $this->db->prepare($sql);

        if($type_loc && $type_loc != 'Selectionner...') $req->bindValue(':type_loc', $type_loc, PDO::PARAM_STR);
        if($surface_loc_min) $req->bindValue(':surface_loc_min', $surface_loc_min, PDO::PARAM_STR);
        if($surface_loc_max) $req->bindValue(':surface_loc_max', $surface_loc_max, PDO::PARAM_STR);
        if($localisation){  $req->bindValue(':localisation', $localisation.'%', PDO::PARAM_STR);
            $req->bindValue(':localisation_2', $localisation.'%', PDO::PARAM_STR);}
        if($budget_min) $req->bindValue(':budget_min', $budget_min, PDO::PARAM_STR);
        if($budget_max) $req->bindValue(':budget_max', $budget_max, PDO::PARAM_STR);
        if($nb_piece_loc) $req->bindValue(':nb_piece_loc', $nb_piece_loc, PDO::PARAM_STR);

        $req->bindValue(':limite', $limite, PDO::PARAM_INT);
        $req->bindValue(':nombre', $nombre, PDO::PARAM_INT);

        $req->execute();
        $listeLoc = array();
        foreach ($req->fetchAll(PDO::FETCH_ASSOC) as $value) {
            $listeLoc[] = new Location($value);
        }

        return $listeLoc;
    }

    public function getNbByMultiRecherche($liste = array())
    {

        $type_loc = false;
        $surface_loc_min = false;
        $surface_loc_max = false;
        $localisation = false;
        $budget_min = false;
        $budget_max = false;
        $nb_piece_loc = false;
        $sql_type_loc = '';
        $sql_surface_loc_min = '';
        $sql_surface_loc_max = '';
        $sql_localisation = '';
        $sql_budget_min = '';
        $sql_budget_max = '';
        $sql_nb_piece_loc = '';
        foreach ($liste as  $attribut => $valeur){
            switch($attribut){
                case 'type_loc': $type_loc = $valeur; if($valeur && $valeur != 'Selectionner...')$sql_type_loc = ' AND type_loc = :type_loc';
                    break;
                case 'mmin': $surface_loc_min = $valeur; if($valeur) $sql_surface_loc_min = ' AND surface_loc > :surface_loc_min';
                    break;
                case 'mmax': $surface_loc_max = $valeur; if($valeur)$sql_surface_loc_max = ' AND surface_loc < :surface_loc_max';
                    break;
                case 'lieu': $localisation = $valeur; if($valeur)$sql_localisation = ' AND (cp_ad_immeu LIKE :localisation OR ville_ad_immeu LIKE :localisation_2)';
                    break;
                case 'bmin': $budget_min = $valeur; if($valeur)$sql_budget_min = ' AND montant_loc > :budget_min';
                    break;
                case 'bmax': $budget_max = $valeur; if($valeur)$sql_budget_max = ' AND montant_loc < :budget_max';
                    break;
                case 'piece': $nb_piece_loc = $valeur; if($valeur)$sql_nb_piece_loc = ' AND nb_piece_loc = :nb_piece_loc';
                    break;
            }
        }

        $sql = 'SELECT COUNT(*) AS nb FROM location l
        INNER JOIN immeuble i ON i.id_immeu = l.id_immeu
         WHERE id_loc >= 0'.$sql_type_loc.$sql_surface_loc_min.$sql_surface_loc_max.$sql_localisation.$sql_budget_min.$sql_budget_max.$sql_nb_piece_loc;

        $req = $this->db->prepare($sql);

        if($type_loc && $type_loc != 'Selectionner...') $req->bindValue(':type_loc', $type_loc, PDO::PARAM_STR);
        if($surface_loc_min) $req->bindValue(':surface_loc_min', $surface_loc_min, PDO::PARAM_STR);
        if($surface_loc_max) $req->bindValue(':surface_loc_max', $surface_loc_max, PDO::PARAM_STR);
        if($localisation){  $req->bindValue(':localisation', $localisation.'%', PDO::PARAM_STR);
            $req->bindValue(':localisation_2', $localisation.'%', PDO::PARAM_STR);}
        if($budget_min) $req->bindValue(':budget_min', $budget_min, PDO::PARAM_STR);
        if($budget_max) $req->bindValue(':budget_max', $budget_max, PDO::PARAM_STR);
        if($nb_piece_loc) $req->bindValue(':nb_piece_loc', $nb_piece_loc, PDO::PARAM_STR);

        $req->execute();

        return $req->fetchAll(PDO::FETCH_ASSOC)[0]['nb'];
    }


} 